/*
 * Blob.h
 *
 *  Created on: 2020年12月14日
 *      Author: san
 */

#ifndef STRBLOB_H_
#define STRBLOB_H_

#include <vector>
#include <string>
#include <memory>

namespace san {

template<typename T>
class Blob {
public:
	typedef T value_type;
	typedef typename std::vector<T>::size_type size_type;
	// 构造函数和析构函数
	Blob<T>();
	Blob<T>(std::initializer_list<T> il);
	Blob(const T &t): data(std::make_shared<std::vector<T>>(t)) {}
	template <typename It>
	Blob<T>(It first, It last): data(std::vector<T>(first, last)) { }
	virtual ~Blob() {};
	// 返回Blob的size()
	size_type size() { return data->size(); }
	bool empty() { return data->empty(); }
	// 添加删除元素
	void push_back(const T &item) { data->push_back(item); }
	void pop_back() { data->pop_back();}
	// 移动版本
	void push_back(T &&item) { data->push_back(item); }
	// 元素访问
	T &back() { return data->back(); };
	T &operator [](size_type i) { return *data[i]; }
	// begin/end
	auto begin() { return data->begin(); }
	auto end() { return data->end(); }
	// 运算符重载
	friend bool operator ==(const Blob<T> &lhs, const Blob<T> &rhs);

private:
	std::shared_ptr<std::vector<T>> data;
	// 若data[i]无效，抛出异常
	void check(size_type i, const std::string msg) const;
};

template<typename T>
Blob<T>::Blob(std::initializer_list<T> il): data(std::make_shared<std::vector<T>>(il))
{
	// 构造函数
}

template<typename T>
void Blob<T>::check(size_type i, const std::string msg) const
{
	if (i >= data->size())
		throw std::out_of_range(msg);
}

template<typename T>
Blob<T>::Blob(): data(std::make_shared<std::vector<T>>()) {
	// TODO Auto-generated constructor stub
}

template<typename T>
bool operator ==(const Blob<T> &lhs, const Blob<T> &rhs)
{
	return *lhs == *rhs;
}

} /* namespace san */
#endif /* STRBLOB_H_ */
